package business.services;

import java.util.List;
import java.util.Vector;

import business.interfaces.ICancha;
import data.entities.Cancha;
import data.repository.IRepository;
import data.repository.QueryParameter;
import data.repository.Repository;
import data.repository.RepositoryException;

public class ServicioCanchas implements IServicioCanchas {
	private IRepository<Cancha> repositorioCanchas;

	public ServicioCanchas() {
		this.repositorioCanchas = new Repository<Cancha>();
	}
	
	public List<ICancha> getCanchas() throws ServiceException {
		try {
			List<Cancha> canchas = this.repositorioCanchas.getAll(Cancha.class);
			
			return this.getCanchas(canchas);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}		
	}
	
	public List<ICancha> getCanchasParaReservas() throws ServiceException {		
		try {
			String queryExpression = "from Cancha c where c.exclusivaClases = :exclusivaClases";
			QueryParameter parameter = new QueryParameter("exclusivaClases", false);
			List<Cancha> canchas = this.repositorioCanchas.getAll(queryExpression, parameter);
			
			return this.getCanchas(canchas);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}
	
	public ICancha getCancha(Integer numero) throws ServiceException {
		String queryExpression = "from Cancha c where c.numero = :numeroCancha";
		QueryParameter parameter = new QueryParameter("numeroCancha", numero);

		try {
			return this.repositorioCanchas.get(queryExpression, parameter);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public ICancha getCanchaParaClases() throws ServiceException {
		String queryExpression = "from Cancha c where c.exclusivaClases = :exclusivaClases";
		QueryParameter parameter = new QueryParameter("exclusivaClases", true);

		try {
			return this.repositorioCanchas.get(queryExpression, parameter);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}

	public void registrarCancha(String nombre, Boolean paraClases) throws ServiceException {
		Cancha newCancha = new Cancha();
		
		newCancha.setNombre(nombre);
		newCancha.setEstaHabilitada(true);
		newCancha.setExclusivaClases(paraClases);
		
		try {
			this.repositorioCanchas.saveOrUpdate(newCancha);
		} catch (RepositoryException e) {
			throw new ServiceException(e);
		}
	}
	
	private List<ICancha> getCanchas(List<Cancha> canchas) {
		List<ICancha> result = new Vector<ICancha>();
		
		for(Cancha cancha : canchas) {
			result.add(cancha);
		}
		
		return result;
	}
}
